package com.woniu.util;

import com.nimbusds.jose.*;
import com.nimbusds.jose.crypto.MACSigner;
import com.nimbusds.jose.crypto.MACVerifier;

import java.text.ParseException;
import java.util.Map;

public class JWTUtil {

    private static final String KEY = "aosdjfaosidjfatjhvgvhgcgcgvhgvhg";   //At least 256 bits 32个字符就行

    public static String createJWT(Map map) throws JOSEException {
        //生成头部：加密方式，常量
        JWSHeader jwsHeader = new JWSHeader.Builder(JWSAlgorithm.HS256)
                .type(JOSEObjectType.JWT).build();
        //把头部对象通过 base64 编码生成
//        Base64URL base64URL = jwsHeader.toBase64URL();
//        System.out.println(base64URL);

        //载荷部分：存放用户信息

        Payload payload = new Payload(map);
//        System.out.println(payload.toBase64URL());

        //签名部分：头部 + 载荷 + 加密（密钥）
        JWSObject jwsObject = new JWSObject(jwsHeader,payload);

        MACSigner macSigner = new MACSigner(KEY);  //对称加密实现的一个类
        jwsObject.sign(macSigner);   //通过指定的加密方式加密

        String jwt = jwsObject.serialize(); //把签名对象序列化成字符串
        return jwt;
    }

    /**
     * 用密钥解密 JWT
     * @return
     */
    public static Boolean decode(String jwt) throws ParseException, JOSEException {
        JWSObject jwsObject = JWSObject.parse(jwt);
        MACVerifier macVerifier = new MACVerifier(KEY);
        return jwsObject.verify(macVerifier);//解密的方法
    }

    /**
     * 获取jwt 载荷中的用户信息
     */
    public static Map getJWTUserInfo(String jwt) throws ParseException {
        JWSObject jwsObject = JWSObject.parse(jwt);
        Payload payload = jwsObject.getPayload();
        return payload.toJSONObject();
    }
}
